package com.example.demo.interceptor;

import com.example.demo.annotation.Limit;
import com.example.demo.common.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.Order;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.HttpServletResponse;

/**
 * 返回值处理 对方法返回的值进一步进行处理
 *https://www.oschina.net/question/1017691_2247239
 * Cat7373 2017/11/24 20:51
  没有优雅的解决方案，问题的根源在于自定义的处理器会排在最后面，所以只有默认的处理器全部失败才能轮到自己的 解决思路： 1. 不要标记 @ResponseBody 和 @ RestController 2. 利用反射把自己的处理器加到最前面（要依赖实现很不优雅） （在路上想回复来着。。结果不知道为啥 osc 的客户端发不出去评论，还损失了第一次写的内容 0.0）
 * @author lyc
 * @date 2019/6/19.
 */
@Slf4j
@Component
public class HandlerMethodReturnValue implements HandlerMethodReturnValueHandler {
    @Override
    public boolean supportsReturnType(MethodParameter methodParameter) {
        log.info("return{}",methodParameter.getClass());
        return true;
    }

    @Override
    public void handleReturnValue(@Nullable Object o, MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest) throws Exception {
        //标识请求是否已经在该方法内完成处理
        modelAndViewContainer.setRequestHandled(true);
        log.info("return{}",nativeWebRequest.getParameterMap());
        HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);
        response.setContentType("text/plain;charset=UTF-8");

        response.getWriter().println("hello"+o);
    }
}